#ifndef __MIXIN_UNIT_TEST_HH__
#define __MIXIN_MANAGER_UNIT_TEST_HH__

#include <iostream>
#include "MixinBase.hh"
#include "Mixinable.hh"

template< typename T >
struct Mixin0 : public virtual T
{
        Mixin0( void ) : iCounter( 0 ) {}
        void fireMixin0( void ) { iCounter++; }
        uint32_t getValue( void ) { return iCounter; }
        
    private:
        uint32_t iCounter;
};

template< typename T >
        struct Mixin1 : public virtual T
{
        Mixin1( void ) : iCounter( 0 ) {}
        void fireMixin1( void ) { iCounter++; }
        uint32_t getValue( void ) { return iCounter; }
        
    private:
        uint32_t iCounter;
};


typedef Common::Patterns::MixinTypes< Mixin0, Mixin1 > AllMixinTypes;

class SimpleNode : public Common::Patterns::Mixinable< SimpleNode, AllMixinTypes >
{
    public:
        SimpleNode( void ) : a( 0 )
        {
        }

        virtual ~SimpleNode( void )
        {
        }
    
        void addOne( void )
        {
            a++;
        }

        const int& getVal( void ) const
        {
            return a;
        }
    private:
        int a;
};

typedef Common::Patterns::Mixins< Mixin1< SimpleNode >, Mixin0< SimpleNode > > mixedSimpleNode;



#endif //__MIXIN_MANAGER_UNIT_TEST_HH__